import keras
import numpy as np
import matplotlib.pyplot as plt

#按顺序构成的模型,最简单的，一层层的.
from keras.models import Sequential

# 全连接层
from keras.layers import Dense

#使用 numpys随机生成点
#再随机生成一些噪音.

x_data=np.random.rand(100)

noise=np.random.normal(0,0.01,x_data.shape)
y_data=x_data*0.1+0.2+noise #一条线

#显示随机点
plt.scatter(x_data,y_data)
plt.show()


#构建一个顺序模型
model=Sequential()
#在模型中添加一个全连接层
model.add(Dense(units=1,input_dim=1))#输出是一维的，输入也是一维的
#因为会输入一个x的值，输出一个y的值.

#sgd 随机梯度下降法
#mse 均方误差
model.compile(optimizer='sgd',loss='mse')

#训练模型
for step in range(3001):
    #每次都训练一个批次
    #cost 返回的是批量的损失
    cost=model.train_on_batch(x_data,y_data)#每次放入一个批次进行训练
    #每500个cost打印一次cost值.
    if step%500==0:
        print("cost 的值 ",cost)

#打印权值和偏置值
# #只有一层,所以是0
# 因为输入是1，输出是1，所以也只有一个权值.
W,b=model.layers[0].get_weights()
print("W****",W,"b*****",b)


# 把x_data 放进网络中，预测 y_pred
y_pred=model.predict(x_data)
print(type(y_pred))
print(y_pred)

#打印出来，显示随机点
#上边已经打印了，这里就不写了

#显示预测结果
plt.scatter(x_data,y_data)

#预测值为红色，宽度为3
plt.plot(x_data,y_pred,"r-",lw=3)
plt.show()